<?php

namespace Syrius\Model;

class ProxyData {

	/**
	 * Questi due array identificano i dati dell'entità
	 * attachData indica i dati che vengono letti da database
	 * detachData indica i dati che sono modificati dall'utente
	 * ma che non sono ancora stati salvati e quindi si trovano
	 * in uno stato inconsistente
	 */
	private $_attachData = array();
	private $_detachData = array();

	/**
	 * Indica lo stato dell'oggetto, nel caso in cui sia attachable vuol dire
	 * che è nello stato di caricamento da database e non è stato ancora modificato
	 * @var bool
	 */
	private $_attachable = false;

	public function __construct() {

	}


	/**
	 * Imposta tutta la lista di dati in base alla variabile _attachable
	 * @param array $data
	 * @return void
	 */
	public function setData($data = array()) {
		if ($this->_attachable) {
			$this->_attachData = $data;
		} else {
			$this->_detachData = $data;
		}
	}

	/**
	 * Prende il valore associata a key
	 * @param $key
	 * @return
	 */
	public function get($key) {
		if ($this->_attachable) {
			return $this->_attachData[$key];
		} else {
			return $this->_detachData[$key];
		}
	}
    public function getAttached($key){
        return $this -> _attachData[$key];
    }

    public function _proxySet($value){
        if (@is_null($value)) return true;
        if (isset($value)) return true;
        return false;
    }

	/**
	 * @param $key
	 * @return bool
	 */
	public function isValue($key) {
		if ($this->_attachable) {
			if (@$this -> _proxySet($this->_attachData[$key]))
				return true;
			return false;
		} else {
            if (@$this -> _proxySet($this->_detachData[$key]))
				return true;
            return false;
		}
	}

    public function isAttachedValue($key){
        if (isset($this->_attachData[$key]))
				return true;
			return false;
    }

	/**
	 * Permette di salvare un value di una key
	 * @param $key
	 * @param $value
	 * @return void
	 */
	public function set($key, $value) {
		$this->setDetach();
		$this->_detachData[$key] = $value;
	}

	/**
	 * @return void
	 */
	public function setAttach() {
		$this->_attachData = array_merge($this->_attachData, $this->_detachData);
		$this->_detachData = array();
		$this->_attachable = true;
	}

	/**
	 * @return void
	 */
	public function setDetach() {
		$this->_attachable = false;
	}
}

?>